package com.baizhi.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
@RequestMapping("file")
public class FileController {
    private static final Logger logger = LoggerFactory.getLogger(FileController.class);

    @Value("${file.upload.dir}")
    private String realPath;

    /**
     * 测试文件上传
     * 注意：这种方式存在局限性，不推荐再使用这种方式进行文件上传
     * 这种方式不能用于jar包部署
     */
    @PostMapping("upload")
    public String upload(MultipartFile file, HttpServletRequest request) throws IOException {  // 注意：变量名字要与文件选择name属性一致
        logger.debug("文件名：{}", file.getOriginalFilename());
        logger.debug("文件大小：{}", file.getSize());
        logger.debug("文件类型：{}", file.getContentType());

        // 根据相对路径，获取绝对路径(真实路径)
        String realPath = request.getSession().getServletContext().getRealPath("/upload");
        logger.debug("获取绝对路径：{}", realPath);
        // 上传文件
        String fileName = file.getOriginalFilename();
        String ext = fileName.substring(fileName.lastIndexOf("."));
        String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ext;
        file.transferTo(new File(realPath, newFileName));

        return "redirect:/upload.jsp";
    }

    /**
     * 第二种文件上传
     * 注意：这种方式适合于任何一种部署方式，推荐使用这种方式
     */
    @PostMapping("upload2")
    public String upload2(MultipartFile file) throws IOException {
        // 文件名
        String fileName = file.getOriginalFilename();
        logger.debug("文件名：{}", fileName);
        logger.debug("文件大小：{}", file.getSize());
        logger.debug("文件类型：{}", file.getContentType());

        // 改名
        String ext = fileName.substring(fileName.lastIndexOf("."));
        String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + ext;

        // 上传文件
        file.transferTo(new File(realPath, newFileName));

        return "redirect:/upload.jsp";
    }

    /**
     * 文件下载
     */
    @RequestMapping("download")
    public void download(String fileName, HttpServletResponse response) throws IOException {
        logger.debug("当前下载文件名：{}", fileName);
        logger.debug("当前下载文件目录：{}", realPath);

        // 根据文件名，读取文件
        File file = new File(realPath, fileName);
        // 将读取文件，通过response响应
        InputStream is = new FileInputStream(file);
        // 获取响应流之前，一定要设置以附件形式下载
        response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
        // 获取响应输出流
        ServletOutputStream os = response.getOutputStream();
        // 输入流复制给输出流
        FileCopyUtils.copy(is, os);
    }
}
